package com.teamone.etl.util;

import java.util.Objects;
import org.apache.commons.lang3.StringUtils;

/**
 * @Description 脱敏工具类Plus
 * @Author WangZhuoRan
 * @Date 2021-01-12 18:54
 */
public class DesensitizationUtilPro {

    /**
     * 默认填充字符
     */
    public static final String DEFAULT_PAD_STR = "*";
    public static final int RETURN_LENGTH = 2;

    /**
     * 数据脱敏
     * 当字符创为空串或字符串长度小于等于 2 时，直接返回
     * 当【字符串总长度】减 {@code leftLen} 减 {@code rightLen} 小于等于 【字符串总长度】的三分之一时，则左右各展示【字符串总长度】的三分之一
     * @param data     需要脱敏的数据
     * @param leftLen  左边展示几位
     * @param rightLen 右边展示几位
     * @param padStr   填充字符串，如果长度为 1， 则按位填充；否则否则直接填充，可用于颜文字填充场景
     * @return 脱敏后信息
     */
    public static String process(String data, Integer leftLen, Integer rightLen, String padStr) {
        int length = StringUtils.length(data);
        if (StringUtils.isBlank(data) || length <= RETURN_LENGTH) {
            return data;
        }

        int oneThird = length / 3;

        // 设置默认值
        leftLen = Objects.isNull(leftLen) ? oneThird : leftLen;
        rightLen = Objects.isNull(rightLen) ? oneThird : rightLen;
        padStr = StringUtils.isBlank(padStr) ? DEFAULT_PAD_STR : padStr;

        if (length - leftLen - rightLen <= oneThird) {
            leftLen = oneThird;
            rightLen = oneThird;
        }


        String left = StringUtils.left(data, leftLen);
        String right = StringUtils.right(data, rightLen);
        if (StringUtils.length(padStr) == 1) {
            return StringUtils.rightPad(left, data.length() - rightLen, padStr).concat(right);
        }
        return left + padStr + right;
    }

    /**
     * 数据脱敏
     */
    public static String process(String data, Integer leftLen, Integer rightLen) {
        return process(data, leftLen, rightLen, DEFAULT_PAD_STR);
    }

    /**
     * 证件号码脱敏，输出【前六后四】: 422824********8732
     */
    public static String idcard(String idcard) {
        return process(idcard, 6, 4);
    }

    public static void main(String[] args) {
        System.out.println(process("110101199003070513", 6, 4));
        System.out.println(process("1234567890", 6, 4));
        System.out.println(process("1234567890", 6, 4, "(*^▽^*)"));
    }

}
